﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace Discuz.Common
{
    public class Validator
    {
        /// <summary>
        /// 判断对象是否为Int32类型的数字
        /// </summary>
        /// <param name="Expression"></param>
        /// <returns></returns>
        public static bool IsNumeric(object expression)
        {
            if (expression != null)
                return IsNumeric(expression.ToString());

            return false;

        }

        /// <summary>
        /// 判断对象是否为Int32类型的数字
        /// </summary>
        /// <param name="Expression"></param>
        /// <returns></returns>
        public static bool IsNumeric(string expression)
        {
            if (expression != null)
            {
                string str = expression;
                if (str.Length > 0 && str.Length <= 11 && Regex.IsMatch(str, @"^[-]?[0-9]*[.]?[0-9]*$"))
                {
                    if ((str.Length < 10) || (str.Length == 10 && str[0] == '1') || (str.Length == 11 && str[0] == '-' && str[1] == '1'))
                        return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 验证密码是否是字母数字一起的。
        /// </summary>
        /// <param name="Expression"></param>
        /// <returns></returns>
        public static bool validatepassWord(string passWord)
        {
            if (Regex.IsMatch(passWord, @"\w[a-zA-Z]+?\d+?|\d+?\w[a-zA-Z]+?"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 是否为Double类型
        /// </summary>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static bool IsDouble(object expression)
        {
            if (expression != null)
                return Regex.IsMatch(expression.ToString(), @"^([0-9])[0-9]*(\.\w*)?$");

            return false;
        }

        /// <summary>
        /// 判断给定的字符串数组(strNumber)中的数据是不是都为数值型
        /// </summary>
        /// <param name="strNumber">要确认的字符串数组</param>
        /// <returns>是则返加true 不是则返回 false</returns>
        public static bool IsNumericArray(string[] strNumber)
        {
            if (strNumber == null)
                return false;

            if (strNumber.Length < 1)
                return false;

            foreach (string id in strNumber)
            {
                if (!IsNumeric(id))
                    return false;
            }
            return true;
        }
        #region 检查手机号码，并返回正确的号码
        /// <summary>
        /// ------------------------------------------------------------------------------------
        /// 检查手机号码，并返回正确的号码
        /// 
        /// </summary>
        /// <param name="pMobile">待检查的号码</param>
        /// <param name="correctMobile">正确的号码</param>
        /// <returns></returns>
        public static bool CheckPhone(string pMobile, out string correctMobile)
        {
            bool isSuccess = false;
            correctMobile = string.Empty;

            /*
             *首先匹配手机
             * 前面可以为86或者+86或者没有
             * 号段匹配：
             * 13：除了1349（中国卫通，不属于手机号段）
             * 15：全号段匹配
             * 18：180（电信），185，186（联通）,187,188（移动）,189（电信）
             * */
            if (System.Text.RegularExpressions.Regex.IsMatch(pMobile, @"^(\+?86)?1(3[0-35-9]\d|34[0-8]|47\d|5\d{2}|8[0-35-9]\d)\d{7}$"))
            {
                isSuccess = true;
                correctMobile = pMobile.Substring(pMobile.Length - 11);
            }
            else
            {
                /*
                 * 小灵通匹配,云南省区号：0691西双版纳，0692德宏
                 * 0870昭通，0871昆明，0872大理，0873红河，0874曲靖，0875保山，0876文山，0877玉溪，0878楚雄，0879普洱
                 * 0883临沧，0886怒江，0887迪庆，0888丽江
                 * 匹配模式868711234567,8608711234567,8610608711234567,10608711234567,08711234567,86前面的+可有可无
                 * */
                if (System.Text.RegularExpressions.Regex.IsMatch(pMobile, @"^((\+?86)|((\+?86)?(106)?0)|0?)(87\d|88[36-8]|69[12])[1-9]\d{6}$"))
                {
                    isSuccess = true;
                    correctMobile = "0" + pMobile.Substring(pMobile.Length - 10);
                }
            }

            return isSuccess;
        }
        /// <summary>
        /// 电话号码类型判断
        /// </summary>
        /// <param name="mobile">电话号码</param>
        /// <returns>
        /// 返回值：
        ///     1   移动手机
        ///     2   联通手机
        ///     3   电信手机
        ///     4   固定电话、小灵通
        ///     0   未知
        /// </returns>
        public static int CardType(string mobile)
        {
            //移动电话
            if (Regex.IsMatch(mobile, @"^\d{11}$") && mobile.Substring(0, 1) != "0")
            {
                switch (mobile.Substring(0, 3))
                {
                    case "134":
                    case "135":
                    case "136":
                    case "137":
                    case "138":
                    case "139":
                    case "150":
                    case "152":
                    case "147":
                    case "151":
                    case "157"://3g
                    case "158":
                    case "159":
                    case "182":
                    case "183":
                    case "187"://3g
                    case "188"://3g
                        return 1;
                    case "130":
                    case "131":
                    case "132":
                    case "155":

                    case "156":
                    case "185"://3g
                    case "186"://3g
                        return 2;
                    case "133":
                    case "153":
                    case "189"://3g
                    case "180"://3g
                    case "181"://3g
                        return 3;
                    default:
                        return 0;

                }
            }
            //固定电话
            else if (Regex.IsMatch(mobile, @"^\d{3,4}-{0,1}\d{7,8}$"))
                return 4;
            //未知
            else
                return 0;
        }
        /// <summary>
        /// 电话号码类型判断
        /// </summary>
        /// <param name="mobile">电话号码</param>
        /// <returns>
        /// 返回值：
        ///     1   网内
        ///     2   网外
        ///     3   固定电话、小灵通
        ///     4   未知
        /// </returns>
        public static int CardTypeX(string mobile)
        {
            //移动电话
            if (Regex.IsMatch(mobile, @"^\d{11}$") && mobile.Substring(0, 1) != "0")
            {
                switch (mobile.Substring(0, 3))
                {
                    case "134":
                    case "135":
                    case "136":
                    case "137":
                    case "138":
                    case "139":
                    case "147":
                    case "150":
                    case "151":
                    case "157"://3g
                    case "158":
                    case "159":
                    case "182":
                    case "152":
                    case "187"://3g
                    case "188"://3g
                    case "183":
                        return 1;
                    case "130":
                    case "131":
                    case "132":
                    case "155":

                    case "156":
                    case "185"://3g
                    case "186"://3g

                        return 2;
                    case "133":
                    case "153":
                    case "189"://3g
                    case "180"://3g
                    case "181"://3g
                        return 2;
                    default:
                        return 4;

                }
            }
            //固定电话
            else if (Regex.IsMatch(mobile, @"^\d{3,4}-{0,1}\d{7,8}$"))
                return 3;
            //未知
            else
                return 4;
        }


        #endregion
    }
}
